// POSIX信号量实现环形队列
// 规则怪谈：
// 1. 空，生产者先行
// 2. 满，消费者先行
// 3. 生产者不能把消费者套一个圈以上
// 4. 消费者不能超过生产者

#pragma once

#include <iostream>
#include <pthread.h>
#include <semaphore.h>

namespace SemMoudle
{
    const int defaultvalue = 1;
    class Sem
    {
    public:
        Sem(unsigned int value = defaultvalue)
        {
            sem_init(&_sem, 0, value);
        }

        void P() // 等待
        {
            int n = sem_wait(&_sem);
            // if (n != 0)
            // {
            //     std::cout << "sem_wait error" << std::endl; // 出错处理
            // }
            (void)n;
        }

        void V() // 通知
        {
            int n = sem_post(&_sem);
            // if (n != 0)
            // {
            //     std::cout << "sem_post error" << std::endl; // 出错处理
            // }
            (void)n;
        }

        ~Sem()
        {
            sem_destroy(&_sem);
        }

    private:
        sem_t _sem;
    };
}
